import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

/**
 * Module1Homework
 */
public class Module1Homework {

    public static void main(String[] args) {

        System.out.println("--------------------测试题1----------------------");
        System.out.println("这是一年中的第" + DayOfYear() + "天"); 
        System.out.println("--------------------测试题2----------------------");
        wanNumbers();
        System.out.println("--------------------测试题3----------------------");
        generateCode();
        System.out.println("--------------------测试题4----------------------");
        autoExpandArray(new int[10]);
        System.out.println("--------------------测试题5----------------------");
        Gomoku();
    }
    
    public static int DayOfYear(){

        System.out.println("请输入年月日(以空格分隔)：");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        int month = scanner.nextInt();
        int day = scanner.nextInt();

        //平年每个月的天数
        int[] monthDays = {0, 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31};

        //四年一闰，百年不闰，四百年闰
        //平年 或是 闰年月份小于3
        if((month < 3) || !(year%100!=0 && year%4==0 || year%400==0)){

            return arrSumToIndex(monthDays, month) + day;
        }
        //闰年且月份大于3
        else{
            return arrSumToIndex(monthDays, month) + day + 1;

        }

    }

    public static int arrSumToIndex(int[] arr,int toIndex){
        int sum = 0;
        for (int i = 0; i < toIndex; i++) {
            sum += arr[i];
        }
        return sum;
    }

    //编程找出 1000 以内的所有完数并打印出来。 所谓完数就是一个数恰好等于它的因子之和，如：6=1＋2＋3
    public static void wanNumbers(){
        for (int i = 1; i < 1000; i++) {
            int sum = 0;
            for (int j = 1; j < i; j++) {
                if(i % j == 0){
                    sum += j;
                }
            }
            if (sum == i) {
                System.out.println(i);
            }
        }
    }

    //实现双色球抽奖游戏中奖号码的生成，中奖号码由 6 个红球号码和 1 个蓝球号码组成。
    //其中红球号码要求随机生成 6 个 1~33 之间不重复的随机号码。 
    //其中蓝球号码要求随机生成 1 个 1~16 之间的随机号码。 
    public static void generateCode() {
        Random random = new Random();

        int[] redBalls = new int[6];
        for (int i = 0; i < redBalls.length; i++) {
            int randomNum = random.nextInt(33) +1 ;
            if (!isNumInArr(redBalls, randomNum)) {
                redBalls[i] = randomNum;
            }
        }

        int blueBall = random.nextInt(16) +1 ;

        System.out.println("红球中奖号码：" + Arrays.toString(redBalls));
        System.out.println("蓝球中奖号码：" + blueBall);
        
    }

    public static boolean isNumInArr(int[] arr, int num) {

        boolean isNumInArr = false;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == num) {
                return true;
            }
        }
        return isNumInArr;
    }

    //自定义数组扩容规则，当已存储元素数量达到总容量的 80%时，扩容 1.5 倍。
    // 例如，总容量是 10，当输入第 8 个元素时，数组进行扩容，容量从 10 变 15
    public static int[] autoExpandArray(int[] arr) {
        int factor = arr.length * 8 / 10;
        int factorRemain = arr.length * 8 % 10;
        factor = factorRemain == 0 ? factor : ++factor;

        Random random = new Random();        
        for (int i = 0; i < arr.length; i++) {
            arr[i] = random.nextInt() + 1;
            if (i == factor-1) {
                System.out.println("扩容前数组：" + Arrays.toString(arr));
                arr = Arrays.copyOf(arr, arr.length + arr.length / 2);
                System.out.println("扩容后数组：" + Arrays.toString(arr));
               break;
            }
        }
        return arr;
    }

    // 使用二维数组和循环实现五子棋游戏棋盘的绘制 
    public static void Gomoku() {
        char[][] gomoku = new char[17][17];
        for (int i = 0; i < gomoku.length; i++) {
            if(i == 0){
               char[] firstRow = {' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
               gomoku[0] = firstRow;
            }else{
                gomoku[i][0] = gomoku[0][i];
                Arrays.fill(gomoku[i], 1, gomoku[i].length, '+');
            }
        }
        for (int i = 0; i < gomoku.length; i++) {
            for (int j = 0; j < gomoku[i].length; j++) {
                System.out.print(gomoku[i][j] + "\t");
            }
            System.out.println("\n");
        }
    }
}